package utils

import (
	"errors"
	"fmt"
	sls "github.com/aliyun/aliyun-log-go-sdk"
	"github.com/asim/go-micro/v3/logger"
	"github.com/gogo/protobuf/proto"
	"go.uber.org/zap"
	"net"
	"strconv"
	"time"
)

func AlyLog(Topic string, contents string) {
	logs := []*sls.Log{}
	content := []*sls.LogContent{}
	content = append(content, &sls.LogContent{
		Key:   proto.String(strconv.Itoa(int(logger.FatalLevel))),
		Value: proto.String(contents),
	})
	log := &sls.Log{
		Time:     proto.Uint32(uint32(time.Now().Unix())),
		Contents: content,
	}
	logs = append(logs, log)

	ip, err := externalIP()
	if err != nil {
		fmt.Println(err)
	}
	loggroup := &sls.LogGroup{
		Topic:  proto.String(Topic),
		Source: proto.String(ip.String()),
		Logs:   logs,
	}
	client := sls.CreateNormalInterface(GlobalConf.AlylogConfig.Endpoint, GlobalConf.AlylogConfig.AccessKeyId, GlobalConf.AlylogConfig.AccessKeySecret, "")

	err = client.PutLogs(GlobalConf.AlylogConfig.ProjectName, GlobalConf.AlylogConfig.LogStoreName, loggroup)
	if err != nil {
		zap.S().Info("输出log错误", err.Error())
		return
	}
}

// 获取ip
func externalIP() (net.IP, error) {
	ifaces, err := net.Interfaces()
	if err != nil {
		return nil, err
	}
	for _, iface := range ifaces {
		if iface.Flags&net.FlagUp == 0 {
			continue // interface down
		}
		if iface.Flags&net.FlagLoopback != 0 {
			continue // loopback interface
		}
		addrs, err := iface.Addrs()
		if err != nil {
			return nil, err
		}
		for _, addr := range addrs {
			ip := getIpFromAddr(addr)
			if ip == nil {
				continue
			}
			return ip, nil
		}
	}
	return nil, errors.New("connected to the network?")
}

// 获取ip
func getIpFromAddr(addr net.Addr) net.IP {
	var ip net.IP
	switch v := addr.(type) {
	case *net.IPNet:
		ip = v.IP
	case *net.IPAddr:
		ip = v.IP
	}
	if ip == nil || ip.IsLoopback() {
		return nil
	}
	ip = ip.To4()
	if ip == nil {
		return nil // not an ipv4 address
	}

	return ip
}
